home *** CD-ROM | disk | FTP | other *** search
/ Robotics & Artificial Int…3 (Professional Edition) / Robotics & Artificial Intelligence Tools 2003 (Professional Edition).iso / robot software / webots-kros-1.0.1_setup.exe / {app} / kteam / include / ieeefp.h < prev    next >
C/C++ Source or Header  |  1999-12-23  |  5KB  |  242 lines

  1. #ifndef _IEEE_FP_H_
  2. #define _IEEE_FP_H_
  3.  
  4. #include "_ansi.h"
  5.  
  6. #include <machine/ieeefp.h>
  7.  
  8. /* FIXME FIXME FIXME:
  9.    Neither of __ieee_{float,double}_shape_tape seem to be used anywhere
  10.    except in libm/test.  If that is the case, please delete these from here.
  11.    If that is not the case, please insert documentation here describing why
  12.    they're needed.  */
  13.  
  14. #ifdef __IEEE_BIG_ENDIAN
  15.  
  16. typedef union 
  17. {
  18.   double value;
  19.   struct 
  20.   {
  21.     unsigned int sign : 1;
  22.     unsigned int exponent: 11;
  23.     unsigned int fraction0:4;
  24.     unsigned int fraction1:16;
  25.     unsigned int fraction2:16;
  26.     unsigned int fraction3:16;
  27.     
  28.   } number;
  29.   struct 
  30.   {
  31.     unsigned int sign : 1;
  32.     unsigned int exponent: 11;
  33.     unsigned int quiet:1;
  34.     unsigned int function0:3;
  35.     unsigned int function1:16;
  36.     unsigned int function2:16;
  37.     unsigned int function3:16;
  38.   } nan;
  39.   struct 
  40.   {
  41.     unsigned long msw;
  42.     unsigned long lsw;
  43.   } parts;
  44.     long aslong[2];
  45. } __ieee_double_shape_type;
  46.  
  47. #endif
  48.  
  49. #ifdef __IEEE_LITTLE_ENDIAN
  50.  
  51. typedef union 
  52. {
  53.   double value;
  54.   struct 
  55.   {
  56. #ifdef __SMALL_BITFIELDS
  57.     unsigned int fraction3:16;
  58.     unsigned int fraction2:16;
  59.     unsigned int fraction1:16;
  60.     unsigned int fraction0: 4;
  61. #else
  62.     unsigned int fraction1:32;
  63.     unsigned int fraction0:20;
  64. #endif
  65.     unsigned int exponent :11;
  66.     unsigned int sign     : 1;
  67.   } number;
  68.   struct 
  69.   {
  70. #ifdef __SMALL_BITFIELDS
  71.     unsigned int function3:16;
  72.     unsigned int function2:16;
  73.     unsigned int function1:16;
  74.     unsigned int function0:3;
  75. #else
  76.     unsigned int function1:32;
  77.     unsigned int function0:19;
  78. #endif
  79.     unsigned int quiet:1;
  80.     unsigned int exponent: 11;
  81.     unsigned int sign : 1;
  82.   } nan;
  83.   struct 
  84.   {
  85.     unsigned long lsw;
  86.     unsigned long msw;
  87.   } parts;
  88.  
  89.   long aslong[2];
  90.  
  91. } __ieee_double_shape_type;
  92.  
  93. #endif
  94.  
  95. #ifdef __IEEE_BIG_ENDIAN
  96.  
  97. typedef union
  98. {
  99.   float value;
  100.   struct 
  101.   {
  102.     unsigned int sign : 1;
  103.     unsigned int exponent: 8;
  104.     unsigned int fraction0: 7;
  105.     unsigned int fraction1: 16;
  106.   } number;
  107.   struct 
  108.   {
  109.     unsigned int sign:1;
  110.     unsigned int exponent:8;
  111.     unsigned int quiet:1;
  112.     unsigned int function0:6;
  113.     unsigned int function1:16;
  114.   } nan;
  115.   long p1;
  116.   
  117. } __ieee_float_shape_type;
  118.  
  119. #endif
  120.  
  121. #ifdef __IEEE_LITTLE_ENDIAN
  122.  
  123. typedef union
  124. {
  125.   float value;
  126.   struct 
  127.   {
  128.     unsigned int fraction0: 7;
  129.     unsigned int fraction1: 16;
  130.     unsigned int exponent: 8;
  131.     unsigned int sign : 1;
  132.   } number;
  133.   struct 
  134.   {
  135.     unsigned int function1:16;
  136.     unsigned int function0:6;
  137.     unsigned int quiet:1;
  138.     unsigned int exponent:8;
  139.     unsigned int sign:1;
  140.   } nan;
  141.   long p1;
  142.   
  143. } __ieee_float_shape_type;
  144.  
  145. #endif
  146.  
  147.  
  148.  
  149.  
  150.  
  151. /* FLOATING ROUNDING */
  152.  
  153. typedef int fp_rnd;
  154. #define FP_RN 0     /* Round to nearest         */
  155. #define FP_RM 1        /* Round down             */
  156. #define FP_RP 2        /* Round up             */
  157. #define FP_RZ 3        /* Round to zero (trunate)     */
  158.  
  159. fp_rnd _EXFUN(fpgetround,(void));
  160. fp_rnd _EXFUN(fpsetround, (fp_rnd));
  161.  
  162. /* EXCEPTIONS */
  163.  
  164. typedef int fp_except;
  165. #define FP_X_INV 0x10    /* Invalid operation         */
  166. #define FP_X_DX  0x80    /* Divide by zero        */
  167. #define FP_X_OFL 0x04    /* Overflow exception        */
  168. #define FP_X_UFL 0x02    /* Underflow exception        */
  169. #define FP_X_IMP 0x01    /* imprecise exception        */
  170.  
  171. fp_except _EXFUN(fpgetmask,(void));
  172. fp_except _EXFUN(fpsetmask,(fp_except));
  173. fp_except _EXFUN(fpgetsticky,(void));
  174. fp_except _EXFUN(fpsetsticky, (fp_except));
  175.  
  176. /* INTEGER ROUNDING */
  177.  
  178. typedef int fp_rdi;
  179. #define FP_RDI_TOZ 0    /* Round to Zero         */
  180. #define FP_RDI_RD  1    /* Follow float mode        */
  181.  
  182. fp_rdi _EXFUN(fpgetroundtoi,(void));
  183. fp_rdi _EXFUN(fpsetroundtoi,(fp_rdi));
  184.  
  185. int _EXFUN(isnan, (double));
  186. int _EXFUN(isinf, (double));
  187. int _EXFUN(finite, (double));
  188.  
  189.  
  190.  
  191. int _EXFUN(isnanf, (float));
  192. int _EXFUN(isinff, (float));
  193. int _EXFUN(finitef, (float));
  194.  
  195. #define __IEEE_DBL_EXPBIAS 1023
  196. #define __IEEE_FLT_EXPBIAS 127
  197.  
  198. #define __IEEE_DBL_EXPLEN 11
  199. #define __IEEE_FLT_EXPLEN 8
  200.  
  201.  
  202. #define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1))
  203. #define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1))
  204.  
  205. #define __IEEE_DBL_MAXPOWTWO    ((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1))
  206. #define __IEEE_FLT_MAXPOWTWO    ((float)(1L << (32-8) - 1))
  207.  
  208. #define __IEEE_DBL_NAN_EXP 0x7ff
  209. #define __IEEE_FLT_NAN_EXP 0xff
  210.  
  211.  
  212. #define isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
  213.            ((*(long *)&(x) & 0x007fffffL)!=0000000000L))
  214.  
  215. #define isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
  216.            ((*(long *)&(x) & 0x007fffffL)==0000000000L))
  217.  
  218. #define finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L))
  219.  
  220. #ifdef _DOUBLE_IS_32BITS
  221. #undef __IEEE_DBL_EXPBIAS
  222. #define __IEEE_DBL_EXPBIAS __IEEE_FLT_EXPBIAS
  223.  
  224. #undef __IEEE_DBL_EXPLEN
  225. #define __IEEE_DBL_EXPLEN __IEEE_FLT_EXPLEN
  226.  
  227. #undef __IEEE_DBL_FRACLEN
  228. #define __IEEE_DBL_FRACLEN __IEEE_FLT_FRACLEN
  229.  
  230. #undef __IEEE_DBL_MAXPOWTWO
  231. #define __IEEE_DBL_MAXPOWTWO __IEEE_FLT_MAXPOWTWO
  232.  
  233. #undef __IEEE_DBL_NAN_EXP
  234. #define __IEEE_DBL_NAN_EXP __IEEE_FLT_NAN_EXP
  235.  
  236. #undef __ieee_double_shape_type
  237. #define __ieee_double_shape_type __ieee_float_shape_type
  238.  
  239. #endif /* _DOUBLE_IS_32BITS */
  240.  
  241. #endif /* _IEEE_FP_H_ */
  242.